home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1994-06-07 | 22.8 KB | 672 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Geneva
- Geneva
- Geneva
- Geneva
- MODULE FormControllers;
- (* OmInc
- IMPORT
- Domains, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Containers,
- FormModels, FormViews;
- CONST
- noSelection* = Containers.noSelection; noFocus* = Containers.noFocus;
- tab = 09X; ltab = 0AX; rdel = 7X; ldel = 8X; line = 0DX; esc = 1BX;
- arrowLeft = 1CX; arrowRight = 1DX; arrowUp = 1EX; arrowDown = 1FX;
- (* range of currently supported versions *)
- minVersion = 0; maxBaseVersion = 0; maxStdVersion = 0;
- TYPE
- Controller* = POINTER TO ControllerDesc;
- ControllerDesc* = RECORD (Containers.ControllerDesc)
- form-: FormModels.Model;
- view-: FormViews.View
- END;
- Directory* = POINTER TO DirectoryDesc;
- DirectoryDesc* = RECORD (Containers.DirectoryDesc) END;
- List* = POINTER TO ListDesc;
- ListDesc* = RECORD
- next*: List;
- view*: Views.View
- END;
- StdController = POINTER TO StdControllerDesc;
- StdControllerDesc = RECORD (ControllerDesc)
- sel: List; (* (sel = NIL) OR (c.ThisFocus() = NIL) *)
- reader: FormModels.Reader;
- lastX, lastY: LONGINT
- END;
- StdDirectory = POINTER TO StdDirectoryDesc;
- StdDirectoryDesc = RECORD (DirectoryDesc) END;
- MarkMsg = RECORD (Views.Message)
- list: List;
- show: BOOLEAN
- END;
- VAR dir-, stdDir-: Directory;
- (** Controller **)
- PROCEDURE (c: Controller) Clone* (): Controller;
- VAR h: Stores.Store;
- BEGIN
- h := Stores.Clone(c); RETURN h(Controller)
- END Clone;
- PROCEDURE (c: Controller) Internalize* (VAR rd: Stores.Reader);
- VAR tag, thisVersion: SHORTINT;
- BEGIN
- c.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxBaseVersion, thisVersion)
- END Internalize;
- PROCEDURE (c: Controller) Externalize* (VAR wr: Stores.Writer);
- BEGIN
- c.Externalize^(wr);
- wr.WriteVersion(maxBaseVersion)
- END Externalize;
- PROCEDURE (c: Controller) InitView* (view: Views.View);
- VAR v: FormViews.View;
- BEGIN
- c.InitView^(view);
- IF view # NIL THEN
- ASSERT(view IS FormViews.View, 25);
- c.view := view(FormViews.View); c.form := c.view.ThisModel()
- ELSE
- c.form := NIL; c.view := NIL
- END
- END InitView;
- PROCEDURE (c: Controller) ThisView* (): FormViews.View;
- BEGIN
- RETURN c.view
- END ThisView;
- PROCEDURE (c: Controller) Select* (view: Views.View);
- BEGIN
- HALT(127)
- END Select;
- PROCEDURE (c: Controller) Deselect* (view: Views.View);
- BEGIN
- HALT(127)
- END Deselect;
- PROCEDURE (c: Controller) IsSelected* (view: Views.View): BOOLEAN;
- BEGIN
- HALT(127)
- END IsSelected;
- PROCEDURE (c: Controller) GetSelection* (): List;
- BEGIN
- HALT(127)
- END GetSelection;
- PROCEDURE (c: Controller) SetSelection* (l: List);
- BEGIN
- HALT(127)
- END SetSelection;
- (** Directory **)
- PROCEDURE (d: Directory) NewView* (f: FormModels.Model; opts: SET): FormViews.View;
- BEGIN
- HALT(127)
- END NewView;
- (* auxiliary procedures *)
- PROCEDURE MarkList (c: StdController; f: Views.Frame; h: List; show: BOOLEAN);
- VAR l, t, r, b, s: LONGINT;
- BEGIN
- IF (f.front OR f.target) & ~(Containers.noSelection IN c.opts) THEN
- s := 2 * f.unit;
- WHILE h # NIL DO
- c.view.GetRect(f, h.view, l, t, r, b);
- f.MarkRect(l - s, t - s, r + s, b + s, s, Ports.hilite, show);
- h := h.next
- END
- END
- END MarkList;
- PROCEDURE Toggle (c: StdController; view: Views.View);
- BEGIN
- IF c.IsSelected(view) THEN c.Deselect(view) ELSE c.Select(view) END
- END Toggle;
- (* StdController *)
- PROCEDURE (c: StdController) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: SHORTINT;
- BEGIN
- c.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxStdVersion, thisVersion);
- c.sel := NIL; c.lastX := -1
- END Internalize;
- PROCEDURE (c: StdController) Externalize (VAR wr: Stores.Writer);
- BEGIN
- c.Externalize^(wr);
- wr.WriteVersion(maxStdVersion)
- END Externalize;
- PROCEDURE (c: StdController) CopyFrom (source: Controllers.Controller);
- BEGIN
- c.CopyFrom^(source);
- c.sel := NIL; c.lastX := -1
- END CopyFrom;
- PROCEDURE (c: StdController) InitView (view: Views.View);
- BEGIN
- c.InitView^(view);
- c.view.ShowGrid(~(Containers.noSelection IN c.opts))
- END InitView;
- PROCEDURE (c: StdController) RestoreMarks (f: Views.Frame; l, t, r, b: LONGINT);
- BEGIN
- c.RestoreMarks^(f, l, t, r, b);
- IF (c.lastX <= f.l ) OR (c.lastX >= f.r) OR (c.lastY <= f.t) OR (c.lastY >= f.b) THEN
- c.lastX := (f.l + f.r) DIV 2; c.lastY := (f.t + f.b) DIV 2
- END
- END RestoreMarks;
- PROCEDURE (c: StdController) HandleViewMsg (f: Views.Frame;
- VAR msg: Views.Message);
- BEGIN
- WITH msg: MarkMsg DO
- MarkList(c, f, msg.list, msg.show)
- ELSE
- c.HandleViewMsg^(f, msg)
- END
- END HandleViewMsg;
- PROCEDURE (c: StdController) SetOpts (opts: SET);
- BEGIN
- c.SetOpts^(opts);
- IF c.view # NIL THEN c.view.ShowGrid(~(noSelection IN c.opts)) END
- END SetOpts;
- (* subclass hooks *)
- PROCEDURE (c: StdController) GetContextType (VAR type: Stores.TypeName);
- BEGIN
- COPY("FormViews.ViewDesc", type)
- END GetContextType;
- PROCEDURE (c: StdController) GetValidOps (VAR valid: SET);
- BEGIN
- valid := {Controllers.pasteChar, Controllers.paste, Controllers.pasteView};
- IF c.sel # NIL THEN valid := valid + {Controllers.cut, Controllers.copy} END
- END GetValidOps;
- PROCEDURE (c: StdController) NativeModel (model: Models.Model): BOOLEAN;
- BEGIN
- ASSERT(model # NIL, 20);
- RETURN model IS FormModels.Model
- END NativeModel;
- PROCEDURE (c: StdController) NativeView (view: Views.View): BOOLEAN;
- BEGIN
- ASSERT(view # NIL, 20);
- RETURN view IS FormViews.View
- END NativeView;
- PROCEDURE (c: StdController) NativeCursorAt (f: Views.Frame; x, y: LONGINT): INTEGER;
- BEGIN
- ASSERT(f # NIL, 20);
- RETURN Ports.graphicsCursor
- END NativeCursorAt;
- PROCEDURE (c: StdController) GetFirstView (selection: BOOLEAN; VAR v: Views.View);
- VAR r: FormModels.Reader;
- BEGIN
- IF selection THEN
- IF c.sel # NIL THEN v := c.sel.view ELSE v := NIL END
- ELSE
- r := c.form.NewReader(c.reader); c.reader := r;
- r.Set(NIL); r.ReadView(v)
- END
- END GetFirstView;
- PROCEDURE (c: StdController) GetNextView (selection: BOOLEAN; VAR v: Views.View);
- VAR h: List; r: FormModels.Reader;
- BEGIN (* could be optimized *)
- ASSERT(v # NIL, 20);
- IF selection THEN
- h := c.sel; WHILE (h # NIL) & (h.view # v) DO h := h.next END; ASSERT(h # NIL, 21);
- IF h.next # NIL THEN v := h.next.view ELSE v := NIL END
- ELSE
- r := c.form.NewReader(c.reader); c.reader := r;
- r.Set(v); r.ReadView(v)
- END
- END GetNextView;
- PROCEDURE (c: StdController) MarkDropTarget (src, dst: Views.Frame;
- sx, sy, dx, dy: LONGINT;
- show: BOOLEAN);
- CONST dm = 4 * Ports.point; dp = 18 * Ports.point;
- VAR vx, vy, l, t, r, b, w, h: LONGINT; sc: Containers.Controller; s: Views.View;
- BEGIN (* cf. Drop *)
- IF src.view IS FormViews.View THEN
- vx := dx - sx; vy := dy - sy;
- sc := src.view(FormViews.View).ThisController();
- IF sc # NIL THEN
- WITH sc: Controller DO
- sc.GetFirstView(Containers.selection, s);
- WHILE s # NIL DO
- FormModels.GetRect(s, l, t, r, b); w := r - l; h := b - t;
- INC(l, vx); INC(t, vy); FormViews.RoundToGrid(c.view, l, t);
- dst.MarkRect(l, t, l + w, t + h, 0, Ports.invert, show);
- sc.GetNextView(Containers.selection, s)
- END
- END
- END
- ELSE
- FormViews.RoundToGrid(c.view, dx, dy);
- dst.MarkRect(dx - dm, dy, dx + dp, dy + dst.unit, 0, Ports.invert, show);
- dst.MarkRect(dx, dy - dm, dx + dst.unit, dy + dp, 0, Ports.invert, show)
- END
- END MarkDropTarget;
- PROCEDURE (c: StdController) TrackMarks (f: Views.Frame; x, y: LONGINT;
- units, extend, add: BOOLEAN);
- VAR dx, dy, x0, y0, dx0, dy0: LONGINT; isDown: BOOLEAN; h: Views.View;
- PROCEDURE InvertRect (f: Views.Frame; x, y, dx, dy: LONGINT);
- VAR l, t, r, b: LONGINT;
- BEGIN
- IF dx >= 0 THEN l := x; r := x + dx ELSE l := x + dx; r := x END;
- IF dy >= 0 THEN t := y; b := y + dy ELSE t := y + dy; b := y END;
- f.MarkRect(l, t, r, b, 0, Ports.dim50, TRUE)
- END InvertRect;
- PROCEDURE SelectArea (c: StdController; l, t, r, b: LONGINT; toggle: BOOLEAN);
- VAR h: LONGINT; s: FormModels.Reader; v: Views.View; p, q: List; empty: BOOLEAN;
- BEGIN
- IF l > r THEN h := l; l := r; r := h END;
- IF t > b THEN h := t; t := b; b := h END;
- s := c.form.NewReader(c.reader); c.reader := s;
- s.Set(NIL); s.ReadView(v); p := NIL; empty := c.sel = NIL;
- WHILE v # NIL DO
- IF (s.l < r) & (s.t < b) & (s.r > l) & (s.b > t) THEN
- IF toggle THEN Toggle(c, v)
- ELSIF ~empty THEN c.Select(v)
- ELSE NEW(q); q.next := p; p := q; q.view := v
- END
- END;
- s.ReadView(v)
- END;
- (* this optimization prevents the appearance of a temporary singleton *)
- IF ~toggle & empty THEN c.SetSelection(p) END
- END SelectArea;
- BEGIN
- dx := 0; dy := 0; (* vector from (x, y) *)
- InvertRect(f, x, y, dx, dy);
- REPEAT
- f.Input(x0, y0, isDown);
- dx0 := x0 - x; dy0 := y0 - y;
- IF (dx0 # dx) OR (dy0 # dy) THEN
- InvertRect(f, x, y, dx, dy);
- dx := dx0; dy := dy0;
- InvertRect(f, x, y, dx, dy)
- END
- UNTIL ~isDown;
- InvertRect(f, x, y, dx, dy);
- c.lastX := x0; c.lastY := y0;
- IF (dx # 0) OR (dy # 0) THEN
- SelectArea(c, x, y, x + dx, y + dy, extend OR add)
- ELSE
- h := c.form.ViewAt(x, y);
- IF h # NIL THEN
- IF extend OR add THEN Toggle(c, h) ELSE c.Select(h) END
- END
- END
- END TrackMarks;
- PROCEDURE (c: StdController) Resize (view: Views.View; l, t, r, b: LONGINT);
- BEGIN
- c.form.Resize(view, l, t, r, b)
- END Resize;
- PROCEDURE (c: StdController) DeleteSelection;
- VAR script: Domains.Operation; h: List;
- BEGIN
- Models.BeginScript(c.form, "#System:Deletion", script);
- h := c.sel; WHILE h # NIL DO c.form.Delete(h.view); h := h.next END;
- Models.EndScript(c.form, script)
- END DeleteSelection;
- PROCEDURE (c: StdController) MoveLocalSelection (src, dst: Views.Frame; sx, sy,
- dx, dy: LONGINT);
- VAR script: Domains.Operation; sel, h: List;
- BEGIN
- dx := dx - sx; dy := dy - sy;
- IF (dx # 0) OR (dy # 0) THEN
- FormViews.RoundToGrid(c.view, dx, dy);
- sel := c.GetSelection();
- Models.BeginScript(c.form, "#System:Moving", script);
- h := sel; WHILE h # NIL DO c.form.Move(h.view, dx, dy); h := h.next END;
- Models.EndScript(c.form, script);
- c.SetSelection(sel)
- END
- END MoveLocalSelection;
- PROCEDURE (c: StdController) CopyLocalSelection (src, dst: Views.Frame; sx, sy,
- dx, dy: LONGINT);
- VAR script: Domains.Operation; q: Views.View; h, s, t: List;
- BEGIN
- dx := dx - sx; dy := dy - sy;
- IF (dx # 0) OR (dy # 0) THEN
- FormViews.RoundToGrid(c.view, dx, dy);
- Models.BeginScript(c.form, "#System:Copying", script);
- h := c.GetSelection(); s := NIL;
- WHILE h # NIL DO
- q := h.view; c.form.Copy(q, dx, dy);
- NEW(t); t.next := s; s := t; t.view := q;
- h := h.next
- END;
- Models.EndScript(c.form, script);
- c.SetSelection(s)
- END
- END CopyLocalSelection;
- PROCEDURE (c: StdController) SelectionCopy (): Containers.Model;
- VAR f: FormModels.Model; p: List; w, h, dx, dy, l, t, r, b: LONGINT;
- PROCEDURE GetOffset (f: FormModels.Model; p: List; border: LONGINT; VAR dx, dy: LONGINT);
- VAR l, t, vl, vt, vr, vb: LONGINT;
- BEGIN
- IF p # NIL THEN
- l := MAX(LONGINT); t := MAX(LONGINT);
- WHILE p # NIL DO
- FormModels.GetRect(p.view, vl, vt, vr, vb);
- IF vl < l THEN l := vl END;
- IF vt < t THEN t := vt END;
- p := p.next
- END;
- dx := l - border; dy := t - border
- END
- END GetOffset;
- BEGIN
- f := c.form.Clone();
- p := c.sel;
- GetOffset(c.form, p, c.view.border, dx, dy);
- WHILE p # NIL DO
- FormModels.GetRect(p.view, l, t, r, b);
- f.Insert(Views.CopyOf(p.view, Views.deep), l - dx, t - dy, r - dx, b - dy);
- p := p.next
- END;
- f.Init;
- RETURN f
- END SelectionCopy;
- PROCEDURE (c: StdController) NativePaste (m: Models.Model; f: Views.Frame);
- VAR x, y, cw, ch, l, t, r, b: LONGINT; p: Views.View; s: FormModels.Reader;
- n, i: INTEGER;
- BEGIN
- x := c.lastX; y := c.lastY;
- c.view.context.GetSize(cw, ch);
- IF (x <= f.l) OR (x >= f.r) OR (y <= f.t) OR (y >= f.b) THEN
- x := (f.l + f.r) DIV 2; y := (f.r + f.b) DIV 2
- END;
- c.lastX := x; c.lastY := y;
- FormViews.RoundToGrid(c.view, x, y);
- WITH m: FormModels.Model DO
- s := m.NewReader(NIL);
- s.Set(NIL); s.ReadView(p); n := 0;
- WHILE p # NIL DO
- FormModels.GetRect(p, l, t, r, b);
- c.form.Insert(Views.CopyOf(p, Views.deep), x + l, y + t, x + r, y + b); INC(n);
- s.ReadView(p)
- END;
- (* n views have been inserted at the top => select them *)
- c.SelectAll(Containers.deselect);
- i := c.form.NofViews() - n; ASSERT(i >= 0, 100);
- s := c.form.NewReader(s);
- s.Set(NIL); WHILE i # 0 DO s.ReadView(p); DEC(i) END; (* skip old views *)
- WHILE n # 0 DO s.ReadView(p); c.Select(p); DEC(n) END
- END
- END NativePaste;
- PROCEDURE (c: StdController) ArrowChar (f: Views.Frame; ch: CHAR; units, select: BOOLEAN);
- VAR d: LONGINT;
- BEGIN
- d := c.view.grid;
- IF units THEN d := d * c.view.gridFactor END;
- IF ch = arrowLeft THEN
- c.MoveLocalSelection(f, f, 0, 0, -d, 0)
- ELSIF ch = arrowRight THEN
- c.MoveLocalSelection(f, f, 0, 0, +d, 0)
- ELSIF ch = arrowUp THEN
- c.MoveLocalSelection(f, f, 0, 0, 0, -d)
- ELSIF ch = arrowDown THEN
- c.MoveLocalSelection(f, f, 0, 0, 0, +d)
- END
- END ArrowChar;
- PROCEDURE (c: StdController) ControlChar (f: Views.Frame; ch: CHAR);
- BEGIN
- IF (ch = ldel) OR (ch = rdel) THEN c.DeleteSelection END
- END ControlChar;
- PROCEDURE (c: StdController) PasteChar (ch: CHAR);
- END PasteChar;
- PROCEDURE (c: StdController) PasteLChar (ch: Containers.LONGCHAR);
- END PasteLChar;
- PROCEDURE (c: StdController) PasteView (f: Views.Frame; v: Views.View;
- w, h: LONGINT);
- VAR minW, maxW, minH, maxH, x, y: LONGINT;
- BEGIN
- x := c.lastX; y := c.lastY;
- IF (x <= f.l) OR (x >= f.r) OR (y <= f.t) OR (y >= f.b) THEN
- x := (f.l + f.r) DIV 2; y := (f.t + f.b) DIV 2
- END;
- c.lastX := x; c.lastY := y;
- FormViews.RoundToGrid(c.view, x, y);
- c.form.GetEmbeddingLimits(minW, maxW, minH, maxH);
- Properties.PreferredSize(v, minW, maxW, minH, maxH, minW, minH, w, h);
- c.form.Insert(v, x, y, x + w, y + h); c.Select(v)
- END PasteView;
- PROCEDURE (c: StdController) Drop (src, dst: Views.Frame; sx, sy, dx, dy,
- w, h: LONGINT; v: Views.View);
- VAR minW, maxW, minH, maxH, vx, vy, l, t, r, b: LONGINT;
- sc: Containers.Controller; s: Views.View; p, q: List;
- BEGIN (* cf. MarkDropTarget *)
- IF src.view IS FormViews.View THEN
- vx := dx - sx; vy := dy - sy;
- sc := src.view(FormViews.View).ThisController();
- IF sc # NIL THEN
- WITH sc: Controller DO
- sc.GetFirstView(Containers.selection, s); p := NIL;
- WHILE s # NIL DO
- FormModels.GetRect(s, l, t, r, b); w := r - l; h := b - t;
- v := Views.CopyOf(s, Views.deep);
- INC(l, vx); INC(t, vy); FormViews.RoundToGrid(c.view, l, t);
- c.form.Insert(v, l, t, l + w, t + h);
- NEW(q); q.view := v; q.next := p; p := q;
- sc.GetNextView(Containers.selection, s)
- END;
- c.SetSelection(p)
- END
- ELSE
- v := Views.CopyOf(v, Views.deep);
- FormViews.RoundToGrid(c.view, dx, dy);
- c.form.GetEmbeddingLimits(minW, maxW, minH, maxH);
- Properties.PreferredSize(v, minW, maxW, minH, maxH, minW, minH, w, h);
- c.form.Insert(v, dx, dy, dx + w, dy + h); c.Select(v)
- END
- ELSE
- v := Views.CopyOf(v, Views.deep);
- FormViews.RoundToGrid(c.view, dx, dy);
- c.form.GetEmbeddingLimits(minW, maxW, minH, maxH);
- Properties.PreferredSize(v, minW, maxW, minH, maxH, minW, minH, w, h);
- c.form.Insert(v, dx, dy, dx + w, dy + h); c.Select(v)
- END
- END Drop;
- (* selection *)
- PROCEDURE (c: StdController) HasSelection (): BOOLEAN;
- BEGIN
- RETURN c.sel # NIL
- END HasSelection;
- PROCEDURE (c: StdController) Selectable (): BOOLEAN;
- BEGIN
- RETURN c.form.NofViews() # 0
- END Selectable;
- PROCEDURE (c: StdController) SetSingleton (s: Views.View);
- VAR l: List;
- BEGIN
- c.SetSingleton^(s);
- IF s # NIL THEN NEW(l); l.view := s; c.sel := l ELSE c.sel := NIL END
- END SetSingleton;
- PROCEDURE (c: StdController) SelectAll (select: BOOLEAN);
- VAR s: FormModels.Reader; v: Views.View; l, h: List; msg: MarkMsg;
- BEGIN
- IF select THEN
- ASSERT(~(Containers.noSelection IN c.opts), 20);
- c.SetFocus(NIL);
- s := c.form.NewReader(c.reader); c.reader := s;
- s.Set(NIL); s.ReadView(v);
- IF c.form.NofViews() = 1 THEN
- ASSERT(v # NIL, 100);
- c.SetSingleton(v)
- ELSE
- IF (c.sel # NIL) & (c.sel.next = NIL) THEN c.SetSingleton(NIL) END;
- l := NIL;
- WHILE v # NIL DO
- IF ~c.IsSelected(v) THEN NEW(h); h.next := l; l := h; h.view := v END;
- s.ReadView(v)
- END;
- msg.list := l; c.sel := l; msg.show := TRUE; Views.Broadcast(c.view, msg)
- END
- ELSIF c.sel # NIL THEN
- IF c.sel.next = NIL THEN (* singleton *)
- c.SetSingleton(NIL)
- ELSE
- msg.list := c.sel; c.sel := NIL; msg.show := FALSE; Views.Broadcast(c.view, msg)
- END
- END
- END SelectAll;
- PROCEDURE (c: StdController) InSelection (f: Views.Frame; x, y: LONGINT): BOOLEAN;
- VAR g: Views.Frame;
- BEGIN
- g := Views.FrameAt(f, x, y);
- IF g # NIL THEN
- RETURN c.IsSelected(g.view)
- ELSE
- RETURN FALSE
- END
- END InSelection;
- PROCEDURE (c: StdController) MarkSelection (f: Views.Frame; show: BOOLEAN);
- BEGIN
- IF c.sel = NIL THEN (* skip *)
- ELSIF c.sel.next = NIL THEN
- Containers.MarkSingleton(c, f, show)
- ELSE
- MarkList(c, f, c.sel, show)
- END
- END MarkSelection;
- (* caret *)
- PROCEDURE (c: StdController) HasCaret (): BOOLEAN;
- BEGIN
- RETURN TRUE
- END HasCaret;
- PROCEDURE (c: StdController) MarkCaret (f: Views.Frame; show: BOOLEAN);
- END MarkCaret;
- (* FormController protocol *)
- PROCEDURE (c: StdController) Select (view: Views.View);
- VAR l, h, sel: List; msg: MarkMsg;
- BEGIN
- ASSERT(view # NIL, 20); ASSERT(view.context.ThisModel() = c.form, 21);
- ASSERT(~(Containers.noSelection IN c.opts), 22);
- l := c.sel; WHILE (l # NIL) & (l.view # view) DO l := l.next END;
- IF l = NIL THEN (* view is not yet selected *)
- sel := c.sel;
- IF sel = NIL THEN
- c.SetSingleton(view)
- ELSE
- NEW(l); l.view := view;
- IF sel.next = NIL THEN
- c.SetSingleton(NIL); ASSERT(c.sel = NIL, 100);
- l.next := sel; c.sel := l;
- msg.list := l
- ELSE
- l.next := sel; c.sel := l;
- NEW(h); h.view := view;
- msg.list := h
- END;
- msg.show := TRUE; Views.Broadcast(c.view, msg)
- END
- END
- END Select;
- PROCEDURE (c: StdController) Deselect (view: Views.View);
- VAR l, h: List; msg: MarkMsg;
- BEGIN
- ASSERT(view # NIL, 20); ASSERT(view.context.ThisModel() = c.form, 21);
- l := c.sel; h := NIL; WHILE (l # NIL) & (l.view # view) DO h := l; l := l.next END;
- IF l # NIL THEN (* l is selection node of view, h its predecessor *)
- IF (h = NIL) & (l.next = NIL) THEN (* singleton *)
- c.SetSingleton(NIL)
- ELSE
- IF h = NIL THEN c.sel := l.next ELSE h.next := l.next END;
- msg.list:= l; l.next := NIL; msg.show := FALSE; Views.Broadcast(c.view, msg);
- IF (c.sel # NIL) & (c.sel.next = NIL) THEN (* singleton *)
- view := c.sel.view;
- msg.list := c.sel; c.sel := NIL; msg.show := TRUE; Views.Broadcast(c.view, msg);
- c.SetSingleton(view)
- END
- END
- END
- END Deselect;
- PROCEDURE (c: StdController) IsSelected (view: Views.View): BOOLEAN;
- VAR l: List;
- BEGIN
- ASSERT(view # NIL, 20); ASSERT(view.context.ThisModel() = c.form, 21);
- l := c.sel; WHILE (l # NIL) & (l.view # view) DO l := l.next END;
- RETURN l # NIL
- END IsSelected;
- PROCEDURE (c: StdController) GetSelection (): List;
- VAR l, h, s: List;
- BEGIN
- l := NIL; s := c.sel;
- WHILE s # NIL DO NEW(h); h.next := l; l := h; h.view := s.view; s := s.next END;
- RETURN l
- END GetSelection;
- PROCEDURE (c: StdController) SetSelection (l: List);
- VAR msg: MarkMsg;
- BEGIN
- c.SelectAll(FALSE); ASSERT(c.sel = NIL, 100);
- IF l = NIL THEN (* skip *)
- ELSIF l.next = NIL THEN
- c.SetSingleton(l.view)
- ELSE
- msg.list := l; c.sel := l; msg.show := TRUE; Views.Broadcast(c.view, msg)
- END
- END SetSelection;
- (* StdDirectory *)
- PROCEDURE (d: StdDirectory) NewController (opts: SET): Controller;
- VAR c: StdController;
- BEGIN
- NEW(c); c.SetOpts(opts); c.Init; RETURN c
- END NewController;
- PROCEDURE (d: StdDirectory) NewView (f: FormModels.Model; opts: SET): FormViews.View;
- VAR c: Containers.Controller; v: FormViews.View;
- BEGIN
- v := FormViews.dir.New(f); c := v.ThisController();
- IF c # NIL THEN c.SetOpts(opts) ELSE v.SetController(d.NewController(opts)) END;
- RETURN v
- END NewView;
- (** miscellaneous **)
- PROCEDURE Focus* (): Controller;
- VAR v: Views.View; c: Controllers.Controller;
- BEGIN
- v := Controllers.FocusView();
- IF (v # NIL) & (v IS FormViews.View) THEN
- c := v(FormViews.View).ThisController();
- IF (c # NIL) & (c IS Controller) THEN
- RETURN c(Controller)
- ELSE RETURN NIL
- END
- ELSE RETURN NIL
- END
- END Focus;
- PROCEDURE Insert* (c: Controller; view: Views.View; l, t, r, b: LONGINT);
- VAR w, h: LONGINT;
- BEGIN
- w := r - l; h := b - t;
- FormViews.RoundToGrid(c.view, l, t);
- c.form.Insert(view, l, t, l + w, t + h)
- END Insert;
- PROCEDURE SetDir* (d: Directory);
- BEGIN
- ASSERT(d # NIL, 20); dir := d
- END SetDir;
- PROCEDURE Install*;
- BEGIN
- FormViews.SetCtrlDir(dir)
- END Install;
- PROCEDURE Init;
- VAR d: StdDirectory;
- BEGIN
- NEW(d); SetDir(d); stdDir := d
- END Init;
- BEGIN
- Init
- END FormControllers.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Geneva
- Documents.ControllerDesc
-